home *** CD-ROM | disk | FTP | other *** search
/ EnigmA Amiga Run 1995 October / EnigmA AMIGA RUN 01 (1995)(G.R. Edizioni)(IT)[!][issue 1995-10][Aminet 7].iso / Aminet / dev / gcc / ixemul_src.lha / ixemul-41.0 / library / _wb_parse.c < prev    next >
C/C++ Source or Header  |  1995-05-17  |  4KB  |  154 lines

  1. /*
  2.  *  This file is part of ixemul.library for the Amiga.
  3.  *  Copyright (C) 1991, 1992  Markus M. Wild
  4.  *
  5.  *  This library is free software; you can redistribute it and/or
  6.  *  modify it under the terms of the GNU Library General Public
  7.  *  License as published by the Free Software Foundation; either
  8.  *  version 2 of the License, or (at your option) any later version.
  9.  *
  10.  *  This library is distributed in the hope that it will be useful,
  11.  *  but WITHOUT ANY WARRANTY; without even the implied warranty of
  12.  *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
  13.  *  Library General Public License for more details.
  14.  *
  15.  *  You should have received a copy of the GNU Library General Public
  16.  *  License along with this library; if not, write to the Free
  17.  *  Software Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
  18.  *
  19.  *  _wb_parse.c,v 1.1.1.1 1994/04/04 04:30:42 amiga Exp
  20.  *
  21.  *  _wb_parse.c,v
  22.  * Revision 1.1.1.1  1994/04/04  04:30:42  amiga
  23.  * Initial CVS check in.
  24.  *
  25.  *  Revision 1.2  1992/08/09  20:42:46  amiga
  26.  *  get rid of some warnings
  27.  *
  28.  *  Revision 1.1  1992/05/14  19:55:40  mwild
  29.  *  Initial revision
  30.  *
  31.  */
  32.  
  33. /*
  34.  * Originally written by Olaf "Olsen" Barthel. Thanks Olsen!
  35.  * I left his indentation style...
  36.  */
  37.  
  38. #define KERNEL
  39. #include "ixemul.h"
  40.  
  41. #include <workbench/workbench.h>
  42. #include <workbench/startup.h>
  43.  
  44. #define BASE_EXT_DECL
  45. #define BASE_EXT_DECL0
  46. #define BASE_PAR_DECL  void *iconbase, 
  47. #define BASE_PAR_DECL0 void *iconbase
  48. #define BASE_NAME      iconbase
  49. #include <inline/icon.h>
  50.  
  51.     /* wb_parse():
  52.      *
  53.      *    A more or less decent rewrite of Manx' original
  54.      *    wb_parse() routine which will do the following:
  55.      *
  56.      *    - if open_wb_window is zero no console window
  57.      *      will be opened.
  58.      *
  59.      *    - if default_wb_window points to a valid string
  60.      *      it will be used to open the window.
  61.      *
  62.      *    - if everything fails, read the icon file,
  63.      *      scan it for a "WINDOW" tool type and take
  64.      *      the corresponding tool type entry string
  65.      *      (somewhat primitive if compared to the Macintosh
  66.      *      way of doing it...).
  67.      *
  68.      *    This routine will return TRUE if it was able to
  69.      *    open an output file, FALSE otherwise.
  70.      */
  71.  
  72. int
  73. _wb_parse(struct Process *ThisProcess,struct WBStartup *WBenchMsg,
  74.       char *default_wb_window)
  75. {
  76.   void  *iconbase;
  77.   char    *WindowName    = NULL;
  78.   int    fd = -1;
  79.   extern char *strdup (char *);
  80.  
  81.         /* Are we to open a console window? */
  82.  
  83.     if(default_wb_window != (char *)-1)
  84.     {
  85.  
  86.             /* Any special name preference? */
  87.  
  88.         if(default_wb_window)
  89.             WindowName = default_wb_window;
  90.         else
  91.         {
  92.                 /* Do we have a valid tool window? */
  93.  
  94.             if(WBenchMsg -> sm_ToolWindow)
  95.                 WindowName = WBenchMsg -> sm_ToolWindow;
  96.             else
  97.             {
  98.                     /* Open icon.library. */
  99.  
  100.                 if(iconbase = OpenLibrary("icon.library",0))
  101.                 {
  102.                     struct DiskObject *Icon;
  103.  
  104.                         /* Try to load the icon file. */
  105.  
  106.                     if(Icon = GetDiskObject(iconbase, WBenchMsg -> sm_ArgList[0] . wa_Name))
  107.                     {
  108.                             /* Look for a "WINDOW" tool type. */
  109.  
  110.                         WindowName = (u_char *) FindToolType(iconbase, (u_char **) Icon -> do_ToolTypes, "WINDOW");
  111.                         if (WindowName)
  112.                             WindowName = strdup (WindowName);
  113.  
  114.                         FreeDiskObject(iconbase, Icon);
  115.                     }
  116.  
  117.                     CloseLibrary(iconbase);
  118.                 }
  119.             }
  120.         }
  121.  
  122.             /* Are we to open a file? */
  123.  
  124.         if (WindowName)
  125.           fd = syscall (SYS_open, WindowName, 2);
  126.         if (fd != -1)
  127.           {
  128.             /* this fd "should" be 0, since we didn't open any files
  129.              * till now when running under workbench */
  130.             if (fd != 0)
  131.                 ix_panic ("_wb_parse: first opened fd != 0!");
  132.  
  133.             ThisProcess -> pr_ConsoleTask    = u.u_ofile[fd]->f_fh->fh_Type;
  134.             syscall (SYS_dup2, fd, 2); 
  135.             /* now dup() the descriptor to cover an additional descriptor, 
  136.              * so that by closing 0-2 pr_ConsoleTask doesn't vanish yet */
  137.             syscall (SYS_dup2, fd, NOFILE-1);
  138.                 syscall (SYS_close, fd);
  139.  
  140.             
  141.             fd = syscall (SYS_open, "*", 0);
  142.             if (fd != -1)
  143.               ThisProcess -> pr_CIS        = CTOBPTR (u.u_ofile[fd]->f_fh);
  144.  
  145.             fd = syscall (SYS_open, "*", 1);
  146.               ThisProcess -> pr_COS        = CTOBPTR (u.u_ofile[fd]->f_fh);
  147.  
  148.             return 1;
  149.           }
  150.     }
  151.  
  152.     return(FALSE);
  153. }
  154.